package org.csu.softwaremetrics_demo.metric;

/**
 * 类信息访问器
 * 用于访问和收集Java源代码中的类、接口和枚举的基本信息
 * 继承自AST访问器，可以遍历语法树获取类型信息
 */

import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.EnumDeclaration;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.TypeDeclaration;

public class ClassInfo extends ASTVisitor {

    private String className;
    private String type;

    /**
     * 访问类型声明节点
     * 获取类或接口的完整类名和类型信息
     *
     * @param node 类型声明节点
     * @return false 表示不需要访问子节点
     */
    @Override
    public boolean visit(TypeDeclaration node) {

        getFullClassName(node.resolveBinding());

        if (node.isInterface()) type = "interface";
        else type = "class";

        return false;
    }

    /**
     * 访问枚举声明节点
     * 获取枚举类型的完整类名
     *
     * @param node 枚举声明节点
     * @return false 表示不需要访问子节点
     */
    @Override
    public boolean visit(EnumDeclaration node) {
        type = "enum";
        getFullClassName(node.resolveBinding());
        return false;
    }

    /**
     * 获取完整类名
     *
     * @return 类的完整限定名
     */
    public String getClassName() {
        return className;
    }

    /**
     * 获取类型
     *
     * @return 返回"class"、"interface"或"enum"
     */
    public String getType() {
        return type;
    }

    /**
     * 从类型绑定中获取完整类名
     *
     * @param binding 类型绑定对象
     */
    private void getFullClassName(ITypeBinding binding) {
        if (binding != null)
            this.className = binding.getBinaryName();
    }

}
